#include "param.h"

/* Distancia euclideana en R^2. */
double dist(Punto p1, Punto p2)
{
	double X = (p1.x + p2.x);
	double Y = (p1.y + p2.y);
	
	double res = sqrt(X*X + Y*Y);
	
	return res;
}

/* Parametrizaciones. */
void param_Uniforme(vdouble& param, int n, double variacion)
{
	double valor = 0;
	
	forn(i, n)
	{
		param[i] = valor;
		valor += variacion;
		cout << param[i] << " ";
	}
	
	return;
}

void param_Chord(vPunto& coordenadas, vdouble& param, int n, double variacion)
{
	double valor = 0;
	
	forn(i, n-1)
	{
		param[i] = valor;
		valor += variacion * dist(coordenadas[i], coordenadas[i+1]);
	}
	
	/* n siempre es mayor a 0 */
	param[n-1] = valor;
	
	return;
}

void param_Centripeta(vPunto& coordenadas, vdouble& param, int n, double variacion)
{
	double valor = 0;
	
	forn(i, n-1)
	{
		param[i] = valor;
		valor += variacion * sqrt(dist(coordenadas[i], coordenadas[i+1]));
	}
	
	/* n siempre es mayor a 0 */
	param[n-1] = valor;
		
	return;
}

/* Deja el parámetro t entre 0 y 1. */
void enRango(vdouble& param, int n)
{
	double fin = param[n-1];
	
	fornx(i, 1, n)
		param[i] /= fin;
	
	return;
}

void param_puntos(vPunto& coordenadas, vdouble& param, vPunto& puntos_x, vPunto& puntos_y, int n)
{
	forn(i, n)
	{
		puntos_x[i].x = param[i];
		puntos_x[i].y = coordenadas[i].x;
		
		puntos_y[i].x = param[i];
		puntos_y[i].y = coordenadas[i].y;
	}
	
	return;
}


void muestreo_Uniforme(vdouble& muestreo, int m)
{
	double cantidad = 1.0/(m-1);
	double valor = 0;	
	
	forn(i, m)
	{
		muestreo[i] = valor;
		valor += cantidad;
	}
	
	return;
}
